package com.jzo2o.health.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.health.model.domain.Orders;
import com.jzo2o.health.model.dto.request.OrdersCancelReqDTO;
import com.jzo2o.health.model.dto.request.OrdersPageQueryReqDTO;
import com.jzo2o.health.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.health.model.dto.response.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * TODO
 *
 * @Author whx
 * @Date 2024/12/13 21:56
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * 下单接口
     * @param placeOrderReqDTO
     * @return
     */
    PlaceOrderResDTO place(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * 订单支付
     * @param id
     * @param tradingChannel
     * @return
     */
    OrdersPayResDTO pay(Long id, PayChannelEnum tradingChannel);

    /**
     * 分页查询订单
     * @param dto
     * @return
     */
    List<OrdersResDTO> pageQuery(Integer ordersStatus, Long sortBy);

    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    OrdersDetailResDTO detail(Long id);

    /**
     * 分页查询
     * @param ordersPageQueryReqDTO
     * @return
     */
    PageResult<OrdersResDTO> pageQueryForAdmin(OrdersPageQueryReqDTO ordersPageQueryReqDTO);

    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    AdminOrdersDetailResDTO aggregation(Long id);

    /**
     * 根据状态统计数量
     * @return
     */
    OrdersCountResDTO countByStatus();

    /**
     * 支付成功
     * @param productOrderNo
     * @param transactionId
     * @param paySuccessTime
     */
    void paySuccess(Long productOrderNo, String transactionId, LocalDateTime paySuccessTime);

    /**
     * 查询订单支付结果
     * @param id
     * @return
     */
    OrdersPayResDTO payResult(Long id);

    /**
     * 订单取消
     * @param dto
     */
    void cancel(OrdersCancelReqDTO dto);

    /**
     * 订单退款
     * @param dto
     */
    void refund(OrdersCancelReqDTO dto);

    /**
     * 取消未支付订单
     * @param orderId 订单ID
     * @param cancelReason 取消原因
     * @param isSystem true-系统自动触发取消  false-人为触发取消
     */
    void cancelOrderByNoPay(Long orderId, String cancelReason, boolean isSystem);
}
